package com.boot.util;

import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;
import com.boot.common.constant.SystemConstant;
import com.boot.common.property.SecurityProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class JwtUtil {

    @Autowired
    SecurityProperties securityProperties;

    /**
     * 生成JWT令牌
     * @param username 用户名
     * @param channel 渠道
     * @return JWT令牌
     */
    public String generateToken(String username, String channel) {
        // JWT过期时间(秒)（24小时）
        int ttl = 86400;
        if (SystemConstant.Channel.PC.equals(channel)){
            ttl = SystemConstant.PC_TOKEN_EXPIRE.intValue();
        }else if(SystemConstant.Channel.APP.equals(channel)){
            ttl = SystemConstant.APP_TOKEN_EXPIRE.intValue();
        }
        Map<String, Object> payload = new HashMap<>();
        Date now = new Date();
        payload.put(JWTPayload.ISSUED_AT, now);
        // 设置过期时间
        Date expiresAt = cn.hutool.core.date.DateUtil.offsetSecond(now, ttl);
        payload.put(JWTPayload.EXPIRES_AT, expiresAt);
        payload.put(JWTPayload.SUBJECT, username);
        payload.put(JWTPayload.JWT_ID, IdUtil.simpleUUID());
        return JWTUtil.createToken(payload, securityProperties.getJwtKey().getBytes(StandardCharsets.UTF_8));
    }
    
    /**
     * 验证JWT令牌
     * @param token JWT令牌
     * @return 是否有效
     */
    public Boolean validateToken(String token) {
        JWT jwt = JWTUtil.parseToken(token);
        return jwt.setKey(securityProperties.getJwtKey().getBytes(StandardCharsets.UTF_8)).validate(0);
    }
    
    /**
     * 从JWT令牌中获取用户名
     * @param token JWT令牌
     * @return 用户名
     */
    public String getUsernameFromToken(String token) {
        JWT jwt = JWTUtil.parseToken(token);
        JSONObject payloads = jwt.getPayloads();
        return payloads.getStr(JWTPayload.SUBJECT);
    }
}